package main

import (
	"fmt"
	"os"
	"strings"

	configpkg "github.com/liyixin123/my-cos-project/internal/config"
)

func main() {
	fmt.Println("COS 配置迁移工具")
	fmt.Println("此工具帮助您将 .env 格式配置迁移到 JSON 格式")
	fmt.Println("========================================")

	jsonConfigPath, err := configpkg.DefaultJSONPath()
	if err != nil {
		fmt.Printf("无法确定JSON配置路径: %v\n", err)
		os.Exit(1)
	}

	legacyConfigPath, err := configpkg.LegacyEnvPath()
	if err != nil {
		fmt.Printf("无法确定旧配置路径: %v\n", err)
		os.Exit(1)
	}

	currentDirEnv := ".env"

	// 如果JSON配置已存在，询问是否覆盖
	if _, err := os.Stat(jsonConfigPath); err == nil {
		fmt.Printf("JSON配置文件已存在: %s\n", jsonConfigPath)
		fmt.Print("是否要覆盖现有配置? (y/N): ")

		var response string
		fmt.Scanln(&response)
		if strings.ToLower(response) != "y" && strings.ToLower(response) != "yes" {
			fmt.Println("取消迁移")
			return
		}
	}

	cfg := &configpkg.Config{}
	found := false

	// 1. 尝试从 ~/.cos-config 加载
	if _, err := os.Stat(legacyConfigPath); err == nil {
		fmt.Printf("发现旧格式配置文件: %s\n", legacyConfigPath)
		if err := configpkg.LoadEnvFile(legacyConfigPath, cfg); err == nil {
			found = true
			fmt.Println("✓ 成功读取用户配置文件")
		} else {
			fmt.Printf("读取用户配置文件失败: %v\n", err)
		}
	}

	// 2. 尝试从当前目录的 .env 加载
	if _, err := os.Stat(currentDirEnv); err == nil {
		fmt.Printf("发现当前目录配置文件: %s\n", currentDirEnv)
		if err := configpkg.LoadEnvFile(currentDirEnv, cfg); err == nil {
			found = true
			fmt.Println("✓ 成功读取当前目录配置文件")
		} else {
			fmt.Printf("读取当前目录配置文件失败: %v\n", err)
		}
	}

	// 3. 从环境变量补充
	if secretID := os.Getenv("COS_SECRET_ID"); secretID != "" && cfg.SecretID == "" {
		cfg.SecretID = secretID
		found = true
		fmt.Println("✓ 从环境变量读取 Secret ID")
	}
	if secretKey := os.Getenv("COS_SECRET_KEY"); secretKey != "" && cfg.SecretKey == "" {
		cfg.SecretKey = secretKey
		found = true
		fmt.Println("✓ 从环境变量读取 Secret Key")
	}
	if bucket := os.Getenv("COS_BUCKET"); bucket != "" && cfg.Bucket == "" {
		cfg.Bucket = bucket
		found = true
		fmt.Println("✓ 从环境变量读取 Bucket")
	}
	if region := os.Getenv("COS_REGION"); region != "" && cfg.Region == "" {
		cfg.Region = region
		found = true
		fmt.Println("✓ 从环境变量读取 Region")
	}

	if !found {
		fmt.Println("未找到任何配置信息")
		fmt.Println("请手动创建配置文件或设置环境变量")
		return
	}

	// 验证配置完整性
	missing := []string{}
	if cfg.SecretID == "" {
		missing = append(missing, "Secret ID")
	}
	if cfg.SecretKey == "" {
		missing = append(missing, "Secret Key")
	}
	if cfg.Bucket == "" {
		missing = append(missing, "Bucket")
	}
	if cfg.Region == "" {
		missing = append(missing, "Region")
	}

	if len(missing) > 0 {
		fmt.Printf("⚠️  配置不完整，缺少: %s\n", strings.Join(missing, ", "))
		fmt.Print("是否继续创建不完整的配置文件? (y/N): ")

		var response string
		fmt.Scanln(&response)
		if strings.ToLower(response) != "y" && strings.ToLower(response) != "yes" {
			fmt.Println("取消迁移")
			return
		}
	}

	// 显示将要保存的配置
	fmt.Println("\n发现的配置信息:")
	fmt.Printf("Secret ID: %s\n", configpkg.MaskValue(cfg.SecretID))
	fmt.Printf("Secret Key: %s\n", configpkg.MaskValue(cfg.SecretKey))
	fmt.Printf("Bucket: %s\n", cfg.Bucket)
	fmt.Printf("Region: %s\n", cfg.Region)

	fmt.Printf("\n将保存到: %s\n", jsonConfigPath)
	fmt.Print("确认保存? (Y/n): ")

	var response string
	fmt.Scanln(&response)
	if strings.ToLower(response) == "n" || strings.ToLower(response) == "no" {
		fmt.Println("取消迁移")
		return
	}

	// 保存JSON配置
	if err := configpkg.SaveAsJSON(jsonConfigPath, cfg); err != nil {
		fmt.Printf("保存配置失败: %v\n", err)
		os.Exit(1)
	}

	fmt.Printf("✓ 配置迁移完成! JSON配置已保存到: %s\n", jsonConfigPath)

	// 询问是否备份旧配置文件
	if _, err := os.Stat(legacyConfigPath); err == nil {
		fmt.Print("是否备份旧配置文件? (Y/n): ")
		fmt.Scanln(&response)
		if strings.ToLower(response) != "n" && strings.ToLower(response) != "no" {
			backupPath := legacyConfigPath + ".bak"
			if err := os.Rename(legacyConfigPath, backupPath); err != nil {
				fmt.Printf("备份失败: %v\n", err)
			} else {
				fmt.Printf("✓ 旧配置文件已备份到: %s\n", backupPath)
			}
		}
	}

	fmt.Println("\n现在您可以使用统一的JSON配置文件了!")
	fmt.Println("CLI和GUI应用将自动读取此配置文件。")
}
